/*
 * ClienteTransferencia.cpp
 *
 *  Created on: Oct 28, 2012
 *      Author: Hernan
 */

#include "ClienteTransferencia.h"
#include "Connection.h"
#include <dirent.h>

ClienteTransferencia::ClienteTransferencia(string ip, string fuente) {
	this->ip = ip;
	this->directorioFuente = fuente;

}

void ClienteTransferencia::crearDirectorio(string directorio) {
	DIR *folder;
	folder = opendir(directorio.c_str());
	if(folder == NULL){
		mkdir(directorio.c_str());
	}
}

int ClienteTransferencia::iniciarTransferencia(SOCKET sock) {

	char Buffer;
	int len;

	Connection conn(sock);

	crearDirectorio(this->directorioFuente);

	while (true) {

			FILE *archivo;
			long int totalbyte;

			string nombreArch = conn.recvData();

			if (nombreArch == "") {
				return 0;
			}

			//recibe el numero de caracteres que tiene el archivo
			if ((len = recv(sock, (char*) &totalbyte, sizeof(totalbyte), 0))
					== -1) {
				//cout<< "error al recibir la cantidad de totalbyte!!" << endl;
				getchar();
				return -1;
			}
			//cout<< "longitud archivo: " << len << endl;
			string rutaArchivo = this->directorioFuente + "/";
			rutaArchivo.append(nombreArch.c_str());

			//cout<< "la ruta en donde se guardara es: " << rutaArchivo << endl;

			if ((archivo = fopen(rutaArchivo.c_str(), "ab")) == NULL) {
				//cout<< "Error al intenter de abrir el archivo" << endl;
				return -1;
			}

			//cout<< "Transfiriendo el fichero..." << endl;

			while (len != 0 && totalbyte > 0) //mientras estemos conectados con el otro pc
			{
				memset(&Buffer, '\0', sizeof(Buffer));

				//recibimos los datos que envie
				if ((len = recv(sock, &Buffer, sizeof(char), 0)) == -1) {
					//cout<< "\nError al recibir el byte!!" << endl;
					return -1;
				} else if (len > 0) { //si seguimos conectados
					fwrite(&Buffer, sizeof(char), 1, archivo);
					totalbyte--;
				}
			}
			//cout<< "\nFichero recibido con exito!!\n" << endl;
			fclose(archivo);

			string hayMas = conn.recvData();
			////cout<< "hayMas: " << *hayMas << endl;
			if ((hayMas) == "n") {
				return 0;
			}
		}
	////cout<< "Desconectado...\n" << endl;

	return 0;
}

const string& ClienteTransferencia::getDirectorioFuente() const {
	return directorioFuente;
}

void ClienteTransferencia::setDirectorioFuente(const string& directorioFuente) {
	this->directorioFuente = directorioFuente;
}

ClienteTransferencia::~ClienteTransferencia() {
	// TODO Auto-generated destructor stub
}

